package io.renren.common.utils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

/**
 * JSON工具类
 */
public class GsonUtils {
    // 线程安全的
    private static final Gson GSON;
    private static final Gson GSON_NULL; // 不过滤空值

    static {
        GSON = new GsonBuilder().enableComplexMapKeySerialization() // 当Map的key为复杂对象时,需要开启该方法
                // .serializeNulls() //当字段值为空或null时，依然对该字段进行转换
                // .excludeFieldsWithoutExposeAnnotation()//打开Export注解，但打开了这个注解,副作用，要转换和不转换都要加注解
                .setDateFormat("yyyy-MM-dd HH:mm:ss")// 序列化日期格式 "yyyy-MM-dd"
                // .setPrettyPrinting() //自动格式化换行
                .disableHtmlEscaping() // 防止特殊字符出现乱码
                .create();
        GSON_NULL = new GsonBuilder().enableComplexMapKeySerialization() // 当Map的key为复杂对象时,需要开启该方法
                .serializeNulls() // 当字段值为空或null时，依然对该字段进行转换
                // .excludeFieldsWithoutExposeAnnotation()//打开Export注解，但打开了这个注解,副作用，要转换和不转换都要加注解
                .setDateFormat("yyyy-MM-dd HH:mm:ss")// 序列化日期格式 "yyyy-MM-dd"
                // .setPrettyPrinting() //自动格式化换行
                .disableHtmlEscaping() // 防止特殊字符出现乱码
                .create();
    }

    /**
     * 获取gson解析器
     *
     * @return
     */
    public static Gson getGson() {
        return GSON;
    }

    /**
     * 获取gson解析器 有空值 解析
     *
     * @return
     */
    public static Gson getWriteNullGson() {
        return GSON_NULL;
    }

    /**
     * 将对象转成json格式(过滤空值字段)
     *
     * @param object
     * @return
     */
    public static String GsonString(Object object) {
        return GSON.toJson(object);
    }

    /**
     * 将对象转成json格式(不过滤空值字段)
     *
     * @param object
     * @param ser
     * @return
     */
    public static String GsonString(Object object, GsonSerializerFeature ser) {
        if (ser == GsonSerializerFeature.WriteMapNullValue) {
            return GSON_NULL.toJson(object);
        }
        return GSON.toJson(object);
    }

    /**
     * 将json转成特定的cls的对象
     *
     * @param gsonString
     * @param classOfT
     * @param <T>
     * @return
     */
    public static <T> T GsonToBean(String gsonString, Class<T> classOfT) {
        return GSON.fromJson(gsonString, classOfT);
    }

    /**
     * 将json转化为对应的实体对象
     *
     * @param gsonString
     * @param typeOfT
     * @param <T>
     * @return
     */
    public static <T> T GsonToBean(String gsonString, Type typeOfT) {
        return GSON.fromJson(gsonString, typeOfT);
    }

    /**
     * json字符串转成list中有cls的
     *
     * @param gsonString
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> List<T> GsonToList(String gsonString, Class<T> cls) {
        return GSON.fromJson(gsonString, new TypeToken<List<T>>() {
        }.getType());
    }

    /**
     * 将json转成list中有map的
     *
     * @param gsonString
     * @param <T>
     * @return
     */
    public static <T> List<Map<String, T>> GsonToListMaps(String gsonString) {
        return GSON.fromJson(gsonString, new TypeToken<List<Map<String, String>>>() {
        }.getType());
    }

    /**
     * 将json转成map
     *
     * @param gsonString
     * @param <T>
     * @return
     */
    public static <T> Map<String, T> GsonToMaps(String gsonString) {
        return GSON.fromJson(gsonString, new TypeToken<Map<String, T>>() {
        }.getType());
    }
}
